const {
    db,
    sqlExec,
    sqlExecInTransaction,
    startTransaction,
    commitTransaction,
    rollbackTransaction
} = require('../db/mysql57');
const minio = require('../db/minio');

const fileDao = {
    // /*
    //  * 创建上传节点
    //  */
    // async createUploadNode(browser) {
    //     let sql = `insert into Img (browser) VALUES (?)`;
    //     let data = [browser];
    //     return sqlExec(sql, data);
    // },
    // /*
    //  * 获取上传预签名URL
    //  */
    // async getUploadUrl(uid, browser, avatarId) {
    //     let sql = `select
    //         id
    //     from Img
    //     where id = ? and browser = ? and status = ?
    //     LIMIT 1`;
    //     let data = [avatarId, browser, '待上传'];
    //     let res = await sqlExec(sql, data);
    //     if (res.length == 0) {
    //         return { success: false, msg: '该图片不存在' };
    //     }
    //     try {
    //         // 请求MinIO的预签名URL 半小时的时效
    //         let uploadUrlRes = await minio.getUploadUrl(browser, avatarId, 60 * 30);
    //         if (uploadUrlRes.success) {
    //             // 更新数据库中的图片上传状态
    //             sql = `update Img set status = ?, uri = ? where id = ?`;
    //             data = ['上传中', avatarId, avatarId];
    //             await sqlExec(sql, data);
    //             return { success: true, url: uploadUrlRes.url };
    //         } else {
    //             return {success: false, msg: '获取MinIO预签名URL失败' }
    //         }
    //     } catch (error) {
    //         return { success: false, msg: '获取MinIO预签名URL失败' };
    //     }
    // },
    // /*
    //  * 上传完成
    //  */
    // async uploadOK(uid, browser, imgId) {
    //     let sql = `update Img set status = ? where id = ? and browser = ? and status = ?`;
    //     let data = ['已完成', imgId, browser, '上传中'];
    //     return sqlExec(sql, data);
    // }
    // async uploadPublicImg(uid, buffer) {
    //     // 尝试开启事务
    //     let connection;
    //     let result;
    //     let browser = 'hcyj-public';
    //     let uri = '';
    //     try {
    //         connection = await startTransaction();
    //     } catch (error) {
    //         return { success: false, msg: '数据库连接失败' };
    //     }
    //     // 往 PublicImg 表中插入数据
    //     try {
    //         let status = '待上传';
    //         let sql = `insert into PublicImg (browser, uri, status) VALUES (?, ?, ?)`;
    //         let data = [browser, uri, status];
    //         result = await sqlExecInTransaction(connection, sql, data);
    //     } catch (error) {
    //         await rollbackTransaction(connection);
    //         return { success: false, msg: '数据库连接失败' };
    //     }
    //     // 往 MinIO 中上传图片（这个操作应该要封装到 minio 驱动里，后续修改）
    //     try {
    //         uri = `${result.insertId}.jpg`;
    //         await new Promise((resolve, reject) => {
    //             minio.minio.putObject(browser, uri, buffer, buffer.length, async function (err, etag) {
    //                 if (err) {
    //                     reject(err);
    //                     return ;
    //                 }
    //             });
    //             resolve(true);
    //         });
    //     } catch (err) {
    //         await rollbackTransaction(connection);
    //         return { success: false, msg: '上传对象存储服务失败' };
    //     }
    //     // 更新 mysql 数据库中 图片的上传状态
    //     try {
    //         let sql = `update PublicImg set status = ?, uri = ? where id = ?`;
    //         let data = ['已完成', uri, result.insertId];
    //         await sqlExecInTransaction(connection, sql, data);
    //     } catch (err) {
    //         await rollbackTransaction(connection);
    //         return { success: false, msg: '操作数据库失败' };
    //     }
    //     // 提交事务
    //     try {
    //         commitTransaction(connection);
    //     } catch (error) {
    //         await rollbackTransaction(connection);
    //         return { success: false, msg: '事务提交失败' };
    //     }
    //     // 返回数据
    //     return { success: true, msg: "上传图片成功", data: result.insertId };
    // },
    // 获取公共图片的预签名URL
    async getPublicImgUrl(id) {
        let sql = `select browser, uri from PublicImg where id = ?`;
        let data = [ id ];
        let result = await sqlExec(sql, data);
        if (result.length === 0) {
            return { success: false, message: '文件不存在' };
        }
        let { browser, uri } = result[0];
        return minio.getDownloadUrl(browser, uri, 36000);
    }
};

module.exports = fileDao;